// 函数

// 1 默认参数
function ajax(url = new Error("url不能为空"), method = "GET", dataType = "json"){
    console.log(url)
    console.log(method)
    console.log(dataType)
}

// ajax('/user')

function sum(prefix, ...rest){
    // rest = [1,2,3]
    // let result = 0
    // rest.forEach(function(item){
    //     result += item 
    // })

    // reduce 计算 汇总 收敛 把数组中的一堆值计算出一个值
    // return result
    return rest.reduce(function(val, item, index){
        let sum = val + item
        if (index == rest.length-1){
            return sum/rest.length
        } else {
            return sum
        }
    })


}
console.log(sum('$', 1, 2, 3, 4))

// 第二个参数表示初始值
// 上一次执行结果会成为下一次的初始值
let arr4 = [1,2,3]
let result = arr4.reduce(function(val, item, index, origin){
    // console.log(val, item, index, origin)
    return val + item // 返回值会成为下一次函数执行的val
}, 0)

console.log(result)


Array.prototype.reduce2 = function(reducer,init){
    for(let i=0; i<this.length; i++){
        init = reducer(init, this[i])
    }
    return init
}


// 展开运算符
let arr5 = [1,2,3]
let arr6 = [4,5,6]
// let arr7 = [].concat(arr5, arr6)
let arr7 = [...arr5, ...arr6]

console.log(arr7)

let obj1 = {name:'1'}
let obj2 = {age: 2}
let obj3 = {}

// assign
// Object.assign(obj3, obj1, obj2)

obj3 = {...obj1, ...obj2}
console.log(obj3)


// 深度拷贝
let obj5 = {name: 'zf', home: {city: 'beijing'}, hobby: ['学习', '睡觉']}
let obj6 = {}

// obj6 = Object.assign(obj6, obj5) // 浅拷贝
// obj6 = JSON.parse(JSON.stringify(obj5)) // 深拷贝

function clone(origin){
    let newObj = {}
    for(let key in origin){
        if (typeof origin[key] == 'object'){
            newObj[key] = clone(origin[key])
        } else {
            newObj[key] = origin[key]
        }
    }
    return newObj
}

obj6 = clone(obj5)

obj5.home.city = 'guangzhou'
obj5.hobby.push('游戏')
// console.log(obj5.hobby, obj6.hobby)


// 箭头函数 1.声明函数更简单的方法 
// 箭头函数没有自己的this 它会使用上层的this
let obj = {
    name: 'zh',
    getName(){
        setTimeout(()=>{
            console.log(this.name)
        }, 1000)
    }
}
obj.getName()

// 箭头函数的this 
// this 不属于obj8
// object不是封闭作用域，js中只有函数和全局作用域
let obj8 = {
    name: 'obj8',
    getName:()=>{
        // this不指向obj8指向外层的this
        // 箭头函数的this是定死的，指向外层的this
        // 普通函数this指向调用者   箭头函数不能滥用，不适用于this变化的情况
        console.log(this.name)
    }
}
let obj9 = {
    name: 'obj9',
    gn: obj8.getName
}

// obj9.gn()
// obj8.getName()
function print(){
    Array.prototype.slice.call(arguments);
    Array.prototype.forEach.call(arguments, function(){

    })
    // 把类数组转换为数组
    Array.from(arguments).forEach(function(){

    })
}